﻿namespace MobileTrack.Core.Data
{
    using System;
    using MobileTrack.Core.Model;

    public class MobileTrackRepositories : IRepositories
    {
        private readonly MobileTrackContext context;

        private IRepository<Abono> abonos;

        private IRepository<Celular> celulares;

        private IRepository<Seguimiento> seguimientos;

        private IRepository<Sucursal> sucursales;

        private IRepository<Venta> ventas;

        private IRepository<Proveedor> proveedores;

        private IRepository<Marca> marcas;

        private bool disposed;

        public MobileTrackRepositories(MobileTrackContext context)
        {
            this.context = context;
        }

        public IRepository<Abono> Abonos
        {
            get
            {
                return this.abonos ?? (this.abonos = new Repository<Abono>(this.context.Abonos));
            }
        }

        public IRepository<Celular> Celulares
        {
            get
            {
                return this.celulares ?? (this.celulares = new Repository<Celular>(this.context.Celulares));
            }
        }

        public IRepository<Seguimiento> Seguimientos
        {
            get
            {
                return this.seguimientos ?? (this.seguimientos = new Repository<Seguimiento>(this.context.Seguimientos));
            }
        }

        public IRepository<Sucursal> Sucursales
        {
            get
            {
                return this.sucursales ?? (this.sucursales = new Repository<Sucursal>(this.context.Sucursales));
            }
        }

        public IRepository<Venta> Ventas
        {
            get
            {
                return this.ventas ?? (this.ventas = new Repository<Venta>(this.context.Ventas));
            }
        }

        public IRepository<Proveedor> Proveedores
        {
            get
            {
                return this.proveedores ?? (this.proveedores = new Repository<Proveedor>(this.context.Proveedores));
            }
        }

        public IRepository<Marca> Marcas
        {
            get
            {
                return this.marcas ?? (this.marcas = new Repository<Marca>(this.context.Marcas));
            }
        }

        public void SaveChanges()
        {
            this.context.SaveChanges();
        }

        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    this.context.Dispose();
                    this.disposed = true;
                }
            }
        }
    }
}
